package br.org.acessobrasil.portal.facade;

import java.util.List;

import br.org.acessobrasil.facade.FacadeException;
import br.org.acessobrasil.facade.GenericFacade;
import br.org.acessobrasil.portal.modelo.Conteudo;
import br.org.acessobrasil.portal.modelo.Formato;
import br.org.acessobrasil.portal.modelo.InformacaoTipoConteudo;
import br.org.acessobrasil.portal.modelo.TipoConteudo;
import br.org.acessobrasil.portal.modelo.Usuario;
import br.org.acessobrasil.portal.persistencia.LogDao;

@SuppressWarnings("unchecked")
public class InformacaoTipoConteudoFacade extends GenericFacade<Usuario,InformacaoTipoConteudo>{
	private LogDao logDao; 
	public LogDao getLogDao() {
		return logDao;
	}
	
	public void setLogDao(LogDao logDao) {
		this.logDao = logDao;
	}
	private TipoConteudoFacade tipoConteudoFacade;
	public void setTipoConteudoFacade(TipoConteudoFacade tipoConteudoFacade) {
		this.tipoConteudoFacade = tipoConteudoFacade;
	}
	public TipoConteudoFacade getTipoConteudoFacade() {
		return tipoConteudoFacade;
	}
	
	@Override
	public void excluir(Usuario ator, InformacaoTipoConteudo obj) throws FacadeException {
		List<Conteudo> conteudos = tipoConteudoFacade.buscarConteudosDoTipo(obj.getNuTipoConteudo());
		if(conteudos.size()>0){
			throw new FacadeException("Existem conte&uacute;dos com este formato, por isso n&atilde;o &eacute; poss&iacute;vel apagar.<br />Por favor, apague os itens antes, ou apenas desative este campo.");
		}
		super.excluir(ator, obj);
		logDao.addLog(ator, "Apagou a informa&ccedil;&atilde;o de tipo de conteudo [id=" + obj.getNuInformacaoTipoConteudo()+" nome="+obj.getNoInformacao()+"]");
	}
	
	@Override
	public InformacaoTipoConteudo atualizar(Usuario ator, InformacaoTipoConteudo obj) throws FacadeException {
		validar(obj);
		InformacaoTipoConteudo retorno = super.atualizar(ator, obj); 
		//reordenar
		reordenar(obj.getNuTipoConteudo());
		logDao.addLog(ator, "Atualizou a informa&ccedil;&atilde;o de tipo de conteudo [id=" + obj.getNuInformacaoTipoConteudo()+" nome="+obj.getNoInformacao()+"]");
		return retorno;
	}
	
	private void validar(InformacaoTipoConteudo obj) throws FacadeException {
		if(obj.getNuTipoConteudo()==null){
			throw new FacadeException("nuTipoConteudo is null.");
		}
		if(obj.getNoInformacao()==null || obj.getNoInformacao().equals("")){
			throw new FacadeException("Por favor, informe um nome.");
		}
		if(obj.getNoTag()==null || obj.getNoTag().equals("")){
			throw new FacadeException("Por favor, informe um nome para a tag.");
		}
	}
	
	private void reordenar(Long nuTipoConteudo){
		List<InformacaoTipoConteudo> informacoes = getEntityManager()
		.createQuery("Select o From "+InformacaoTipoConteudo.class.getName()+" o WHERE o.nu_tipo_conteudo=? order by o.nu_ordem, o.nu_informacao_tipo_conteudo")
		.setParameter(1,nuTipoConteudo)
		.getResultList();
		for(int i=0;i<informacoes.size();i++){
			informacoes.get(i).setNuOrdem(i+1);
		}
	}
	
	@Override
	public void criar(Usuario ator, InformacaoTipoConteudo obj) throws FacadeException {
		validar(obj);
		super.criar(ator, obj);
		//reordenar
		reordenar(obj.getNuTipoConteudo());
		
		logDao.addLog(ator, "Criou a informa&ccedil;&atilde;o de tipo de conteudo [id=" + obj.getNuInformacaoTipoConteudo()+" nome="+obj.getNoInformacao()+"]");
	}
	
	public List<InformacaoTipoConteudo> buscar(Usuario usuarioLogado, TipoConteudo tipoConteudo) {
		return getEntityManager().createQuery("Select o from " + InformacaoTipoConteudo.class.getName() + " o where o.nu_tipo_conteudo=? order by o.nu_ordem")
			.setParameter(1, tipoConteudo.getNuTipoConteudo())
			.getResultList();
	}

	public TipoConteudo buscarTipoConteudo(Long nuTipoConteudo) {
		return getEntityManager().find(TipoConteudo.class, nuTipoConteudo);
	}

	public List<Formato> buscarFormatos() {
		return getEntityManager().createQuery("Select o From " + Formato.class.getName()+" o").getResultList();
	}
}
